/**
 * 核心工具库 - 统一的工具函数集合
 *
 * 功能：
 * - 用户管理（登录、注销、信息存储）
 * - 表单验证（邮箱、密码）
 * - 通知系统（消息提示）
 * - 头像管理
 * - 工具函数（日期格式化、防抖、节流）
 *
 * 使用方式：
 * 1. 通过全局对象：CoreUtils.getUserInfo()
 * 2. 直接调用全局函数：getUserInfo()
 *
 * 所有函数自动暴露到全局作用域，向后兼容旧代码
 */

// ============================================
// 核心工具类
// ============================================
const CoreUtils = {

    // ========== 用户管理 ==========

    /**
     * 获取当前登录用户信息
     * @returns {Object|null} 用户对象或null
     */
    getUserInfo() {
        try {
            // 兼容多个存储键
            const userStr = localStorage.getItem('currentUser') ||
                           localStorage.getItem('user') ||
                           localStorage.getItem('userInfo');
            return userStr ? JSON.parse(userStr) : null;
        } catch (error) {
            console.error('获取用户信息失败:', error);
            return null;
        }
    },

    /**
     * 设置用户信息
     * @param {Object} userData - 用户数据对象
     */
    setUserInfo(userData) {
        try {
            const userString = JSON.stringify(userData);
            // 同时更新多个键以确保兼容性
            localStorage.setItem('currentUser', userString);
            localStorage.setItem('user', userString);
            localStorage.setItem('userInfo', userString);
        } catch (error) {
            console.error('设置用户信息失败:', error);
        }
    },

    /**
     * 移除用户信息
     */
    removeUserInfo() {
        localStorage.removeItem('currentUser');
        localStorage.removeItem('user');
        localStorage.removeItem('userInfo');
    },

    /**
     * 用户注销
     * @param {string} redirectUrl - 注销后跳转的URL，默认为登录页
     */
    logout(redirectUrl = 'pages/user/login.html') {
        this.removeUserInfo();

        // 关闭用户下拉菜单
        const userDropdown = document.getElementById('user-dropdown');
        if (userDropdown) {
            userDropdown.classList.add('hidden');
        }

        // 跳转到登录页
        window.location.href = redirectUrl;
    },

    /**
     * 更新页面上的用户信息显示
     */
    updateUserInfo() {
        const user = this.getUserInfo();
        if (!user) return;

        // 更新用户名显示
        const userNameElements = document.querySelectorAll('#user-name, #dropdown-username');
        userNameElements.forEach(el => {
            if (el) el.textContent = user.username || '快乐小镇';
        });

        // 更新头像显示
        const avatarElements = document.querySelectorAll('#avatar-placeholder img, #dropdown-avatar img');
        avatarElements.forEach(el => {
            if (el && user.avatar) {
                el.src = user.avatar;
            }
        });

        // 更新积分显示
        const pointsElement = document.getElementById('dropdown-points');
        if (pointsElement && user.points !== undefined) {
            pointsElement.textContent = user.points;
        }

        // 切换登录/用户信息区域显示
        const loginSection = document.getElementById('login-register');
        const userSection = document.getElementById('user-info');
        if (loginSection) loginSection.classList.add('hidden');
        if (userSection) userSection.classList.remove('hidden');
    },

    // ========== 表单验证 ==========

    /**
     * 验证邮箱格式
     * @param {string} email - 邮箱地址
     * @returns {boolean} 是否有效
     */
    validateEmail(email) {
        const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
        return emailPattern.test(email);
    },

    /**
     * 验证密码
     * @param {string} password - 密码
     * @returns {boolean} 是否有效（至少6位）
     */
    validatePassword(password) {
        return password && password.length >= 6;
    },

    /**
     * 验证用户名
     * @param {string} username - 用户名
     * @returns {boolean} 是否有效（3-20位）
     */
    validateUsername(username) {
        return username && username.length >= 3 && username.length <= 20;
    },

    // ========== 通知系统 ==========

    /**
     * 显示通知消息
     * @param {string} title - 标题
     * @param {string} message - 消息内容
     * @param {string} type - 类型：success/error/warning/info
     */
    showNotification(title, message, type = 'info') {
        // 尝试使用Toastify库
        if (typeof Toastify !== 'undefined') {
            const colors = {
                success: '#4CAF50',
                error: '#E63946',
                warning: '#FF9800',
                info: '#2196F3'
            };

            Toastify({
                text: title ? `${title}: ${message}` : message,
                duration: 3000,
                close: true,
                gravity: "top",
                position: "right",
                backgroundColor: colors[type] || colors.info,
                stopOnFocus: true,
            }).showToast();
            return;
        }

        // 降级方案：使用自定义通知元素
        const notification = document.getElementById('notification');
        if (notification) {
            const iconElement = document.getElementById('notification-icon');
            const titleElement = document.getElementById('notification-title');
            const messageElement = document.getElementById('notification-message');

            // 设置图标
            const icons = {
                success: 'fa-check-circle',
                error: 'fa-exclamation-circle',
                warning: 'fa-exclamation-triangle',
                info: 'fa-info-circle'
            };
            if (iconElement) {
                iconElement.className = `fa ${icons[type] || icons.info} mr-2`;
            }

            // 设置内容
            if (titleElement) {
                titleElement.textContent = title ? title + ': ' : '';
                titleElement.style.display = title ? 'inline' : 'none';
            }
            if (messageElement) {
                messageElement.textContent = message;
            }

            // 显示通知
            notification.classList.remove('translate-y-20', 'opacity-0');

            // 3秒后隐藏
            setTimeout(() => {
                notification.classList.add('translate-y-20', 'opacity-0');
            }, 3000);
            return;
        }

        // 最终降级方案：使用alert
        alert(`${title ? title + ': ' : ''}${message}`);
    },

    // ========== 头像管理 ==========

    /**
     * 获取用户头像URL
     * @returns {string} 头像URL
     */
    getUserAvatar() {
        const user = this.getUserInfo();
        return user?.avatar || 'assets/svg/default-avatar.svg';
    },

    /**
     * 设置用户头像
     * @param {string} avatarUrl - 头像URL
     */
    setUserAvatar(avatarUrl) {
        const user = this.getUserInfo();
        if (user) {
            user.avatar = avatarUrl;
            this.setUserInfo(user);
            this.updateUserInfo();
            this.showNotification('成功', '头像更新成功', 'success');
        }
    },

    /**
     * 上传头像文件（模拟）
     * @param {File} file - 图片文件
     * @returns {Promise<string>} 头像URL
     */
    async uploadAvatar(file) {
        return new Promise((resolve, reject) => {
            if (!file || !file.type.startsWith('image/')) {
                reject('请选择有效的图片文件');
                return;
            }

            // 检查文件大小（5MB限制）
            if (file.size > 5 * 1024 * 1024) {
                reject('图片大小不能超过5MB');
                return;
            }

            // 读取文件为Data URL
            const reader = new FileReader();
            reader.onload = (e) => {
                resolve(e.target.result);
            };
            reader.onerror = () => {
                reject('图片读取失败');
            };
            reader.readAsDataURL(file);
        });
    },

    // ========== 工具函数 ==========

    /**
     * 格式化日期
     * @param {Date|string} date - 日期对象或字符串
     * @param {string} format - 格式（默认：YYYY-MM-DD）
     * @returns {string} 格式化后的日期
     */
    formatDate(date, format = 'YYYY-MM-DD') {
        const d = new Date(date);
        if (isNaN(d.getTime())) return '';

        const year = d.getFullYear();
        const month = String(d.getMonth() + 1).padStart(2, '0');
        const day = String(d.getDate()).padStart(2, '0');
        const hours = String(d.getHours()).padStart(2, '0');
        const minutes = String(d.getMinutes()).padStart(2, '0');
        const seconds = String(d.getSeconds()).padStart(2, '0');

        return format
            .replace('YYYY', year)
            .replace('MM', month)
            .replace('DD', day)
            .replace('HH', hours)
            .replace('mm', minutes)
            .replace('ss', seconds);
    },

    /**
     * 防抖函数
     * @param {Function} func - 要执行的函数
     * @param {number} wait - 等待时间（毫秒）
     * @returns {Function} 防抖后的函数
     */
    debounce(func, wait = 300) {
        let timeout;
        return function executedFunction(...args) {
            const later = () => {
                clearTimeout(timeout);
                func(...args);
            };
            clearTimeout(timeout);
            timeout = setTimeout(later, wait);
        };
    },

    /**
     * 节流函数
     * @param {Function} func - 要执行的函数
     * @param {number} limit - 时间限制（毫秒）
     * @returns {Function} 节流后的函数
     */
    throttle(func, limit = 300) {
        let inThrottle;
        return function executedFunction(...args) {
            if (!inThrottle) {
                func(...args);
                inThrottle = true;
                setTimeout(() => inThrottle = false, limit);
            }
        };
    }
};

// ============================================
// 向后兼容：暴露到全局作用域
// ============================================
if (typeof window !== 'undefined') {
    // 用户管理
    window.getUserInfo = CoreUtils.getUserInfo.bind(CoreUtils);
    window.setUserInfo = CoreUtils.setUserInfo.bind(CoreUtils);
    window.removeUserInfo = CoreUtils.removeUserInfo.bind(CoreUtils);
    window.logout = CoreUtils.logout.bind(CoreUtils);
    window.updateUserInfo = CoreUtils.updateUserInfo.bind(CoreUtils);

    // 表单验证
    window.validateEmail = CoreUtils.validateEmail.bind(CoreUtils);
    window.validatePassword = CoreUtils.validatePassword.bind(CoreUtils);
    window.validateUsername = CoreUtils.validateUsername.bind(CoreUtils);

    // 通知系统
    window.showNotification = CoreUtils.showNotification.bind(CoreUtils);

    // 头像管理
    window.getUserAvatar = CoreUtils.getUserAvatar.bind(CoreUtils);
    window.setUserAvatar = CoreUtils.setUserAvatar.bind(CoreUtils);
    window.uploadAvatar = CoreUtils.uploadAvatar.bind(CoreUtils);

    // 工具函数
    window.formatDate = CoreUtils.formatDate.bind(CoreUtils);
    window.debounce = CoreUtils.debounce.bind(CoreUtils);
    window.throttle = CoreUtils.throttle.bind(CoreUtils);

    // 暴露CoreUtils到全局
    window.CoreUtils = CoreUtils;

    console.log('✅ 核心工具库已加载 (CoreUtils)');
}
